package iks.render.anim 
{
	import flash.utils.Dictionary;
	
	/**
	 * 动画数据缓存类, 用于管理已经生成的动画数据
	 * @author Yao Zhenyu
	 */
	public final class KAnimatorInfoCache
	{
		
		public function KAnimatorInfoCache(pc : PrivateClass) 
		{
			if (!(pc is PrivateClass))
				throw new ArgumentError("不能实例化 KAnimatorInfoCache 类");
				
			m_animatorInfos = new Dictionary();
		}
		
///////////////////////////////////////////////////////////////////////////////////////////////////
// 公共域
///////////////////////////////////////////////////////////////////////////////////////////////////

		/**
		 * 获得 KAnimatorInfoCache 的实例
		 */
		public static function get instance() : KAnimatorInfoCache
		{
			if (m_instance == null)
				m_instance = new KAnimatorInfoCache(new PrivateClass());
			
			return m_instance;
		}

		/**
		 * 添加动画数据, 如果该键已经存在, 则会删除原来键对应的对象, 然后再添加新对象.
		 * @param	key 键
		 * @param	animatorInfo 值
		 */
		public function addAnimatorInfo(key : Object, animatorInfo : KBitmapAnimatorInfo) : void
		{
			checkExistAnimatorInfo(key);
			m_animatorInfos[key] = animatorInfo;
		}
		
		/**
		 * 添加动画数据, 如果该键已经存在, 则会删除原来键对应的对象, 然后再添加新对象.
		 * @param	key 键
		 * @param	frames 生成 KBitmapAnimatorInfo 对象需要的 KFrameInfo 对象数组
		 * @return 生成的 KBitmapAnimatorInfo 对象
		 */
		public function addAnimatorInfoForFrames(key : Object, frames : Vector.<KFrameInfo>) : KBitmapAnimatorInfo
		{
			checkExistAnimatorInfo(key);
			
			var animatorInfo : KBitmapAnimatorInfo = new KBitmapAnimatorInfo();
			for each (var frame : KFrameInfo in frames)
				animatorInfo.addFrameInfo(frame);
			m_animatorInfos[key] = animatorInfo;
			
			return animatorInfo;
		}
		
		/**
		 * 删除动画数据, 该函数不帮助释放其键映射的 KBitmapAnimatorInfo 对象, 用户需要自己手动删除.
		 * @param	key 删除的动画数据的键.
		 * @return 如果指定键存在映射对象, 则返回其映射对象, 否则返回 null.
		 */
		public function removeAnimatorInfoForKey(key : Object) : KBitmapAnimatorInfo
		{
			var animatorInfo : KBitmapAnimatorInfo = m_animatorInfos[key];
			if (animatorInfo != null)
			{
				delete m_animatorInfos[key];
				return animatorInfo;
			}
			
			return null;
		}
		
		/**
		 * 删除所有的动画数据, 同时删除键映射的 KBitmapAnimatorInfo 的资源.
		 */
		public function removeAllAnimatorInfos() : void
		{
			var keys : Vector.<Object> = new Vector.<Object>();
			
			for (var key : Object in m_animatorInfos)
				keys.push(key);
				
			for each (key in keys)
			{
				m_animatorInfos[key].dispose();
				delete m_animatorInfos[key];
			}
		}
		
		/**
		 * 获得动画数据.
		 * @param	key 动画对象的匹配键
		 * @return 如果指定键存在对象, 则返回该映射的对象, 否则返回 null.
		 */
		public function getBitmapAnimatorInfoForKey(key : Object) : KBitmapAnimatorInfo
		{
			return m_animatorInfos[key];
		}
		
///////////////////////////////////////////////////////////////////////////////////////////////////
// 私有域
///////////////////////////////////////////////////////////////////////////////////////////////////		

		/**
		 * 检查指定键的动画数据是否存在, 如果存在则删除该键, 和该键对应的动画数据.
		 * @param	key 指定的键.
		 * @return 如果删除了已存在的 键/值, 返回 true, 否则返回 false.
		 */
		private function checkExistAnimatorInfo(key : Object) : Boolean
		{
			var animatorInfo : KBitmapAnimatorInfo = m_animatorInfos[key];
			if (animatorInfo != null)
			{
				animatorInfo.dispose();
				delete m_animatorInfos[key];
				return true;
			}
			
			return false;
		}

		private static var m_instance : KAnimatorInfoCache = null;
		private var m_animatorInfos : Dictionary = null;
	}

}

class PrivateClass
{
}

































///////////////////////////////////////////////////////////////////////////////////////////////////
// end file


